/* 
 * AcompanharChamadoController.java
 * Copyright (c) Faculdade Anhanguera de Anápolis.
 * Tecnologia em Análise e Desenvolvimento de Sistemas.
 * Projeto Multidisciplinar de Autoaprendizagem.
 *
 * Este software é confidencial e propriedade da Faculdade Anhanguera de Anápolis.
 * Não é permitida sua distribuição ou divulgação do seu conteúdo sem expressa autorização da Faculdade Anhanguera de Anápolis.
 * Este arquivo contém informações proprietárias.
 */
package br.com.pma.chamatec.controller;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;

import br.com.pma.chamatec.business.IAgendaBO;
import br.com.pma.chamatec.business.IChamadoBO;
import br.com.pma.chamatec.business.IDepartamentoBO;
import br.com.pma.chamatec.business.IUnidadeBO;
import br.com.pma.chamatec.dominio.TipoSituacao;
import br.com.pma.chamatec.exception.ChamatecExceptionCode;
import br.com.pma.chamatec.exception.ChamatecNegocioException;
import br.com.pma.chamatec.util.EnumResources;
import br.com.pma.entity.Agenda;
import br.com.pma.entity.Chamado;
import br.com.pma.entity.Departamento;
import br.com.pma.entity.Unidade;
import br.com.pma.entity.Usuario;

/**
 * Controlador para o Caso de Uso Acompanhar Chamado.
 *
 * @author Ludemeula Fernandes de Sá
 */
@ManagedBean
@ViewScoped
public class AcompanharChamadoController extends AbstractController {
	private static final long serialVersionUID = -1400661876509004997L;

	@Inject
	private IChamadoBO chamadoBO;

	@Inject
	private IUnidadeBO unidadeBO;

	@Inject
	private IDepartamentoBO departamentoBO;

	@Inject
	private IAgendaBO agendaBO;

	@Inject
	private Chamado chamado;

	@Inject
	private Agenda agenda;

	@Inject
	private Chamado chamadoSearch;

	@Inject
	private Usuario solicitanteSearch;

	private List<Chamado> chamados;
	private List<Unidade> unidades;
	private List<Departamento> departamentosPesquisa;
	private List<Departamento> departamentosCadastro;

	private Boolean isErro;

	/**
	 * @see br.com.pma.chamatec.controller.AbstractController#init()
	 */
	@Override
	@PostConstruct
	public void init() {
		super.init();
		try {
			if (unidades == null || unidades.size() == 0) {
				unidades = unidadeBO.getListDescricao();
			}

			if (departamentosPesquisa == null || departamentosPesquisa.size() == 0) {
				departamentosPesquisa = departamentoBO.getListDescricao();
			}
			pesquisar();
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Volta para a tela de cadastro.
	 * 
	 */
	public String cancelar() {
		chamados = new ArrayList<Chamado>();
		return "index";
	}

	/**
	 * Limpa os campos de pesquisa e a datatable.
	 * 
	 */
	public void limpar() {
		chamados = null;
		chamadoSearch = new Chamado();
	}

	/**
	 * Retorna os dados da entidade Chamado.
	 * 
	 */
	public void pesquisar() {
		try {
			chamados = null;
			chamados = chamadoBO.acompanhar(chamadoSearch, solicitanteSearch, usuarioBean.getUsuario());
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Valida se o chamado selecionado já foi agendado.
	 * 
	 * @param chamado
	 */
	public void validarChamado(Chamado chamado) {
		if (chamado.getIsAgendado() == 0L) {
			ChamatecExceptionCode msg = ChamatecExceptionCode.ME_011;
			addFacesMessage(msg, FacesMessage.SEVERITY_ERROR);
		}
	}

	/**
	 * Executa um Chamado.
	 * 
	 */
	public void executar() {
		try {
			chamado = chamadoBO.executar(chamado);
			addFacesMessage(EnumResources.MS_015);

			chamado = new Chamado();
			pesquisar();
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Inicializa os objetos de Agenda.
	 * 
	 * @param chamado
	 */
	public void inicializarObjetos(Chamado chamado) {
		agenda = new Agenda();
		agenda.setChamado(chamado);
	}

	/**
	 * Valida se o chamado selecionado foi reprovado e exibe mensagem de erro.
	 * 
	 */
	public void validarAgendamento(Chamado chamado) {
		if (chamado.getSituacao().equals(TipoSituacao.REPROVADO.getCodigo())) {
			ChamatecExceptionCode msg = ChamatecExceptionCode.ME_010;
			addFacesMessage(msg, FacesMessage.SEVERITY_ERROR);
		}
	}

	/**
	 * Salva um agendamento.
	 * 
	 */
	public void salvar() {
		try {
			agenda = agendaBO.salvar(agenda);
			init();
			addFacesMessage(EnumResources.MS_014);
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/********************************************* Getters e Setters *****************************************************/
	/**
	 * @return the chamado
	 */
	public Chamado getChamado() {
		return chamado;
	}

	/**
	 * @param chamado the chamado to set
	 */
	public void setChamado(Chamado chamado) {
		this.chamado = chamado;
	}

	/**
	 * @return the agenda
	 */
	public Agenda getAgenda() {
		return agenda;
	}

	/**
	 * @param agenda the agenda to set
	 */
	public void setAgenda(Agenda agenda) {
		this.agenda = agenda;
	}

	/**
	 * @return the chamadoSearch
	 */
	public Chamado getChamadoSearch() {
		return chamadoSearch;
	}

	/**
	 * @param chamadoSearch the chamadoSearch to set
	 */
	public void setChamadoSearch(Chamado chamadoSearch) {
		this.chamadoSearch = chamadoSearch;
	}

	/**
	 * @return the chamados
	 */
	public List<Chamado> getChamados() {
		return chamados;
	}

	/**
	 * @param chamados the chamados to set
	 */
	public void setChamados(List<Chamado> chamados) {
		this.chamados = chamados;
	}

	/**
	 * @return the unidades
	 */
	public List<Unidade> getUnidades() {
		return unidades;
	}

	/**
	 * @param unidades the unidades to set
	 */
	public void setUnidades(List<Unidade> unidades) {
		this.unidades = unidades;
	}

	/**
	 * @return the departamentosPesquisa
	 */
	public List<Departamento> getDepartamentosPesquisa() {
		return departamentosPesquisa;
	}

	/**
	 * @param departamentosPesquisa the departamentosPesquisa to set
	 */
	public void setDepartamentosPesquisa(List<Departamento> departamentosPesquisa) {
		this.departamentosPesquisa = departamentosPesquisa;
	}

	/**
	 * @return the departamentosCadastro
	 */
	public List<Departamento> getDepartamentosCadastro() {
		return departamentosCadastro;
	}

	/**
	 * @param departamentosCadastro the departamentosCadastro to set
	 */
	public void setDepartamentosCadastro(List<Departamento> departamentosCadastro) {
		this.departamentosCadastro = departamentosCadastro;
	}

	/**
	 * @return the isErro
	 */
	public Boolean getIsErro() {
		return isErro;
	}

	/**
	 * @param isErro the isErro to set
	 */
	public void setIsErro(Boolean isErro) {
		this.isErro = isErro;
	}
}